<?php
    /** PHPExcel root directory */
    if (!defined('PHPEXCEL_ROOT')) {
        /**
         * @ignore
         */
        define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../');
        require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
    }

    /**
     * PHPExcel_Settings
     * Copyright (c) 2006 - 2015 PHPExcel
     * This library is free software; you can redistribute it and/or
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
     * version 2.1 of the License, or (at your option) any later version.
     * This library is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Lesser General Public License for more details.
     * You should have received a copy of the GNU Lesser General Public
     * License along with this library; if not, write to the Free Software
     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     * @category   PHPExcel
     * @package    PHPExcel_Settings
     * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
     * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
     * @version    ##VERSION##, ##DATE##
     */
    class PHPExcel_Settings {
        /**    constants */
        /**    Available Zip library classes */
        const PCLZIP     = 'PHPExcel_Shared_ZipArchive';
        const ZIPARCHIVE = 'ZipArchive';
        /**    Optional Chart Rendering libraries */
        const CHART_RENDERER_JPGRAPH = 'jpgraph';
        /**    Optional PDF Rendering libraries */
        const PDF_RENDERER_TCPDF  = 'tcPDF';
        const PDF_RENDERER_DOMPDF = 'DomPDF';
        const PDF_RENDERER_MPDF   = 'mPDF';
        private static $chartRenderers = [
            self::CHART_RENDERER_JPGRAPH,
        ];
        private static $pdfRenderers = [
            self::PDF_RENDERER_TCPDF,
            self::PDF_RENDERER_DOMPDF,
            self::PDF_RENDERER_MPDF,
        ];
        /**
         * Name of the class used for Zip file management
         *    e.g.
         *        ZipArchive
         * @var string
         */
        private static $zipClass = self::ZIPARCHIVE;
        /**
         * Name of the external Library used for rendering charts
         *    e.g.
         *        jpgraph
         * @var string
         */
        private static $chartRendererName;
        /**
         * Directory Path to the external Library used for rendering charts
         * @var string
         */
        private static $chartRendererPath;
        /**
         * Name of the external Library used for rendering PDF files
         *    e.g.
         *         mPDF
         * @var string
         */
        private static $pdfRendererName;
        /**
         * Directory Path to the external Library used for rendering PDF files
         * @var string
         */
        private static $pdfRendererPath;
        /**
         * Default options for libxml loader
         * @var int
         */
        private static $libXmlLoaderOptions = null;

        /**
         * Return the name of the Zip handler Class that PHPExcel is configured to use (PCLZip or ZipArchive)
         *    or Zip file management
         * @return string Name of the Zip handler Class that PHPExcel is configured to use
         *    for Zip file management
         *    e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive
         */
        public static function getZipClass() {
            return self::$zipClass;
        }

        /**
         * Set the Zip handler Class that PHPExcel should use for Zip file management (PCLZip or ZipArchive)
         * @param string $zipClass The Zip handler class that PHPExcel should use for Zip file management
         *                         e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive
         * @return    boolean    Success or failure
         */
        public static function setZipClass($zipClass) {
            if (($zipClass === self::PCLZIP) || ($zipClass === self::ZIPARCHIVE)) {
                self::$zipClass = $zipClass;
                return true;
            }
            return false;
        }

        /**
         * Return the name of the method that is currently configured for cell cacheing
         * @return string Name of the cacheing method
         */
        public static function getCacheStorageMethod() {
            return PHPExcel_CachedObjectStorageFactory::getCacheStorageMethod();
        }

        /**
         * Return the name of the class that is currently being used for cell cacheing
         * @return string Name of the class currently being used for cacheing
         */
        public static function getCacheStorageClass() {
            return PHPExcel_CachedObjectStorageFactory::getCacheStorageClass();
        }

        /**
         * Set the method that should be used for cell cacheing
         * @param string $method    Name of the cacheing method
         * @param array  $arguments Optional configuration arguments for the cacheing method
         * @return boolean Success or failure
         */
        public static function setCacheStorageMethod($method = PHPExcel_CachedObjectStorageFactory::cache_in_memory, $arguments = []) {
            return PHPExcel_CachedObjectStorageFactory::initialize($method, $arguments);
        }

        /**
         * Set the locale code to use for formula translations and any special formatting
         * @param string $locale The locale code to use (e.g. "fr" or "pt_br" or "en_uk")
         * @return boolean Success or failure
         */
        public static function setLocale($locale = 'en_us') {
            return PHPExcel_Calculation::getInstance()->setLocale($locale);
        }

        /**
         * Set details of the external library that PHPExcel should use for rendering charts
         * @param string $libraryName    Internal reference name of the library
         *                               e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH
         * @param string $libraryBaseDir Directory path to the library's base folder
         * @return    boolean    Success or failure
         */
        public static function setChartRenderer($libraryName, $libraryBaseDir) {
            if (!self::setChartRendererName($libraryName)) {
                return false;
            }
            return self::setChartRendererPath($libraryBaseDir);
        }

        /**
         * Return the Chart Rendering Library that PHPExcel is currently configured to use (e.g. jpgraph)
         * @return string|NULL Internal reference name of the Chart Rendering Library that PHPExcel is
         *    currently configured to use
         *    e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH
         */
        public static function getChartRendererName() {
            return self::$chartRendererName;
        }

        /**
         * Identify to PHPExcel the external library to use for rendering charts
         * @param string $libraryName Internal reference name of the library
         *                            e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH
         * @return    boolean    Success or failure
         */
        public static function setChartRendererName($libraryName) {
            if (!in_array($libraryName, self::$chartRenderers)) {
                return false;
            }
            self::$chartRendererName = $libraryName;
            return true;
        }

        /**
         * Return the directory path to the Chart Rendering Library that PHPExcel is currently configured to use
         * @return string|NULL Directory Path to the Chart Rendering Library that PHPExcel is
         *     currently configured to use
         */
        public static function getChartRendererPath() {
            return self::$chartRendererPath;
        }

        /**
         * Tell PHPExcel where to find the external library to use for rendering charts
         * @param string $libraryBaseDir Directory path to the library's base folder
         * @return    boolean    Success or failure
         */
        public static function setChartRendererPath($libraryBaseDir) {
            if ((file_exists($libraryBaseDir) === false) || (is_readable($libraryBaseDir) === false)) {
                return false;
            }
            self::$chartRendererPath = $libraryBaseDir;
            return true;
        }

        /**
         * Set details of the external library that PHPExcel should use for rendering PDF files
         * @param string $libraryName    Internal reference name of the library
         *                               e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF,
         *                               PHPExcel_Settings::PDF_RENDERER_DOMPDF
         *                               or PHPExcel_Settings::PDF_RENDERER_MPDF
         * @param string $libraryBaseDir Directory path to the library's base folder
         * @return boolean Success or failure
         */
        public static function setPdfRenderer($libraryName, $libraryBaseDir) {
            if (!self::setPdfRendererName($libraryName)) {
                return false;
            }
            return self::setPdfRendererPath($libraryBaseDir);
        }

        /**
         * Return the PDF Rendering Library that PHPExcel is currently configured to use (e.g. dompdf)
         * @return string|NULL Internal reference name of the PDF Rendering Library that PHPExcel is
         *     currently configured to use
         *  e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF,
         *  PHPExcel_Settings::PDF_RENDERER_DOMPDF
         *  or PHPExcel_Settings::PDF_RENDERER_MPDF
         */
        public static function getPdfRendererName() {
            return self::$pdfRendererName;
        }

        /**
         * Identify to PHPExcel the external library to use for rendering PDF files
         * @param string $libraryName Internal reference name of the library
         *                            e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF,
         *                            PHPExcel_Settings::PDF_RENDERER_DOMPDF
         *                            or PHPExcel_Settings::PDF_RENDERER_MPDF
         * @return boolean Success or failure
         */
        public static function setPdfRendererName($libraryName) {
            if (!in_array($libraryName, self::$pdfRenderers)) {
                return false;
            }
            self::$pdfRendererName = $libraryName;
            return true;
        }

        /**
         * Return the directory path to the PDF Rendering Library that PHPExcel is currently configured to use
         * @return string|NULL Directory Path to the PDF Rendering Library that PHPExcel is
         *        currently configured to use
         */
        public static function getPdfRendererPath() {
            return self::$pdfRendererPath;
        }

        /**
         * Tell PHPExcel where to find the external library to use for rendering PDF files
         * @param string $libraryBaseDir Directory path to the library's base folder
         * @return boolean Success or failure
         */
        public static function setPdfRendererPath($libraryBaseDir) {
            if ((file_exists($libraryBaseDir) === false) || (is_readable($libraryBaseDir) === false)) {
                return false;
            }
            self::$pdfRendererPath = $libraryBaseDir;
            return true;
        }

        /**
         * Get defined options for libxml loader.
         * Defaults to LIBXML_DTDLOAD | LIBXML_DTDATTR when not set explicitly.
         * @return int Default options for libxml loader
         */
        public static function getLibXmlLoaderOptions() {
            if (is_null(self::$libXmlLoaderOptions) && defined('LIBXML_DTDLOAD')) {
                self::setLibXmlLoaderOptions(LIBXML_DTDLOAD | LIBXML_DTDATTR);
            } elseif (is_null(self::$libXmlLoaderOptions)) {
                self::$libXmlLoaderOptions = true;
            }
            if (version_compare(PHP_VERSION, '5.2.11') >= 0) {
                @libxml_disable_entity_loader((bool)self::$libXmlLoaderOptions);
            }
            return self::$libXmlLoaderOptions;
        }

        /**
         * Set options for libxml loader
         * @param   int $options Options for libxml loader
         */
        public static function setLibXmlLoaderOptions($options = null) {
            if (is_null($options) && defined('LIBXML_DTDLOAD')) {
                $options = LIBXML_DTDLOAD | LIBXML_DTDATTR;
            }
            if (version_compare(PHP_VERSION, '5.2.11') >= 0) {
                @libxml_disable_entity_loader((bool)$options);
            }
            self::$libXmlLoaderOptions = $options;
        }
    }
